#pragma once

enum class KeyName
{
	C,
	D,
	E,
	F,
	G,
	A,
	B,
};

/*
一架标准钢琴由88个琴键（52个白键，36个黑键）和金属弦音板组成。
白键长14.4厘米，宽2.3厘米，黑键上端面宽度应为9毫米~10.5毫米，黑键底宽度应为11毫米~12.5毫米；
黑键长度应为9.4厘米~9.6厘米。 88键全部的宽度是122.4厘米。
国际琴键标准总宽度121.5~123.5厘米。
*/

// mm
constexpr float 白键宽度 = 23;
constexpr float 白键长度 = 144;
constexpr float 白键间隙 = 1;
constexpr float 白键距离 = 白键宽度 + 白键间隙;

constexpr float 黑键宽度 = 12;
constexpr float 黑键长度 = 95;
constexpr float 黑白间隙宽 = 1;
constexpr float 黑白间隙高 = 1;

constexpr float 黑键顶部长度 = 10;

constexpr float 白键上方长度 = 黑键长度 + 黑白间隙高;
constexpr float 白键下方长度 = 白键长度 - 白键上方长度;
// C键上方左侧宽度（4/7）
constexpr float C键上方左侧宽度 = 白键宽度 * 4.0f / 7.0f;
constexpr float C键上方右侧宽度 = 白键宽度 - C键上方左侧宽度;
constexpr float D键上方左侧宽度 = 黑键宽度 + 黑白间隙宽 * 2.0f - C键上方右侧宽度 - 白键间隙;
constexpr float G键上方右侧宽度 = (黑键宽度 - 白键间隙) * 0.5f + 黑白间隙宽;

// 颜色定义
constexpr Color 白键颜色 = createColor(0xffffffff);
constexpr Color 黑键颜色 = createColor(0x000000ff);

// order定义
constexpr float ORDER_BG = Math::OffsetOrder(1.0f, -1);
constexpr float ORDER_WHITE = Math::OffsetOrder(ORDER_BG, -1);
constexpr float ORDER_BLACK = Math::OffsetOrder(ORDER_WHITE, -1);


class UIPianoKey
{
public:
	void Render()
	{
		_sprTop->Render();
		if(_sprBottom)
			_sprBottom->Render();
	}

	void SetId(int id)
	{
		_id = id;
		_init();
	}
private:
	int _state; // 按下状态
	int _id;	// 音高（暂0为中央C，后改为midi标准）
	gcSprite _sprTop;
	gcSprite _sprBottom;

	void _init()
	{
		int id = _id % 12;
		int group = _id / 12;
		float offset_x = group * (白键距离 * 7);

		if (id == 0 || id == 5)
		{// C F
			if (id == 0)
				offset_x += 0;
			else if (id == 5)
				offset_x += 白键距离 * 3;

			_sprTop = g_factory->CreateSpriteDefault(白键颜色);
			_sprBottom = g_factory->CreateSpriteDefault(白键颜色);
			_sprTop->SetOrder(ORDER_WHITE);
			_sprBottom->SetOrder(ORDER_WHITE);

			_sprTop->SetQuad(createQuad(RectF{
				offset_x , 0,
				offset_x + C键上方左侧宽度, 白键上方长度 }));
			_sprBottom->SetQuad(createQuad(RectF{
				offset_x, 白键上方长度,
				offset_x + 白键宽度, 白键长度 }));
		}
		else if (id == 1 || id == 6)
		{// #C #F
			if (id == 1)
				offset_x += (C键上方左侧宽度 + 黑白间隙宽);
			else if (id == 6)
				offset_x += (C键上方左侧宽度 + 黑白间隙宽) + 白键距离 * 3;

			_sprTop = g_factory->CreateSpriteDefault(黑键颜色);
			_sprTop->SetOrder(ORDER_BLACK);

			_sprTop->SetQuad(createQuad(RectF{
				offset_x, 0,
				offset_x + 黑键宽度, 黑键长度 }));
		}
		else if (id == 2)
		{// D
			offset_x += 白键距离;
			_sprTop = g_factory->CreateSpriteDefault(白键颜色);
			_sprBottom = g_factory->CreateSpriteDefault(白键颜色);
			_sprTop->SetOrder(ORDER_WHITE);
			_sprBottom->SetOrder(ORDER_WHITE);

			_sprTop->SetQuad(createQuad(RectF{
				offset_x + D键上方左侧宽度, 0,
				offset_x + (白键宽度 - D键上方左侧宽度 - 黑白间隙宽), 白键上方长度 }));
			_sprBottom->SetQuad(createQuad(RectF{
				offset_x, 白键上方长度,
				offset_x + 白键宽度, 白键长度 }));
		}
		else if (id == 3 || id == 10)
		{// #D #A
			if (id == 3)
				offset_x += 白键距离 * 2 - D键上方左侧宽度 - 白键间隙;
			else if (id == 10)
				offset_x += 白键距离 * 6 - D键上方左侧宽度 - 白键间隙;

			_sprTop = g_factory->CreateSpriteDefault(黑键颜色);
			_sprTop->SetOrder(ORDER_BLACK);

			_sprTop->SetQuad(createQuad(RectF{
				offset_x, 0,
				offset_x + 黑键宽度, 黑键长度}));
		}
		else if (id == 4 || id == 11)
		{// E B
			if (id == 4)
				offset_x += 白键距离 * 2;
			else if (id == 11)
				offset_x += 白键距离 * 6;
			_sprTop = g_factory->CreateSpriteDefault(白键颜色);
			_sprBottom = g_factory->CreateSpriteDefault(白键颜色);
			_sprTop->SetOrder(ORDER_WHITE);
			_sprBottom->SetOrder(ORDER_WHITE);

			_sprTop->SetQuad(createQuad(RectF{
				offset_x + (白键宽度 - C键上方左侧宽度 - 黑白间隙宽), 0,
				offset_x + 白键宽度, 白键上方长度 }));
			_sprBottom->SetQuad(createQuad(RectF{
				offset_x, 白键上方长度,
				offset_x + 白键宽度, 白键长度 }));
		}
		else if (id == 7)
		{// G
			offset_x += 白键距离 * 4;
			_sprTop = g_factory->CreateSpriteDefault(白键颜色);
			_sprBottom = g_factory->CreateSpriteDefault(白键颜色);
			_sprTop->SetOrder(ORDER_WHITE);
			_sprBottom->SetOrder(ORDER_WHITE);

			_sprTop->SetQuad(createQuad(RectF{
				offset_x + D键上方左侧宽度, 0,
				offset_x + 白键宽度 - G键上方右侧宽度, 白键上方长度 }));
			_sprBottom->SetQuad(createQuad(RectF{
				offset_x, 白键上方长度,
				offset_x + 白键宽度, 白键长度 }));
		}
		else if (id == 8)
		{// #G
			offset_x += 白键距离 * 4 + 白键宽度 - G键上方右侧宽度 + 黑白间隙宽;
			_sprTop = g_factory->CreateSpriteDefault(黑键颜色);
			_sprTop->SetOrder(ORDER_BLACK);

			_sprTop->SetQuad(createQuad(RectF{
				offset_x, 0,
				offset_x + 黑键宽度, 黑键长度 }));
		}
		else if (id == 9)
		{// A
			offset_x += 白键距离 * 5;
			_sprTop = g_factory->CreateSpriteDefault(白键颜色);
			_sprBottom = g_factory->CreateSpriteDefault(白键颜色);
			_sprTop->SetOrder(ORDER_WHITE);
			_sprBottom->SetOrder(ORDER_WHITE);

			_sprTop->SetQuad(createQuad(RectF{
				offset_x + G键上方右侧宽度, 0,
				offset_x + 白键宽度 - D键上方左侧宽度, 白键上方长度 }));
			_sprBottom->SetQuad(createQuad(RectF{
				offset_x, 白键上方长度,
				offset_x + 白键宽度, 白键长度 }));
		}
		else
		{
			_sprTop = g_factory->CreateSpriteDefault(ColorDef::NONE);
		}

		_sprTop->SetCoor(g_Game->GetPianoKeyCoor());
		if(_sprBottom)
			_sprBottom->SetCoor(g_Game->GetPianoKeyCoor());
	}
};